#include "stm32f10x.h"                  // Device header
#include "Menu_table.h"
#include "OLED.h"
#include "Key.h"

volatile uint16_t timer3Counter = 0;  // TIM3中断计数器
volatile uint8_t captureFlag = 0;  // 用于触发数据捕捉的标志位
uint16_t Time_Count;	//TIM溢出次数 -- 10ms  	Tout(溢出时间) = (ARR+1)(PSC+1)/Tclk(时钟分割)
uint8_t Keyval_Count;	//按键计数器

/**
  * 函    数：定时中断初始化
  * 参    数：PSC :分频系数
  *			  ARR :计数周期
  * 返 回 值：无
  */
void Timer2_Init(uint16_t PSC,uint16_t ARR)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);			//开启TIM2的时钟	
	TIM_InternalClockConfig(TIM2);		//选择TIM2为内部时钟，若不调用此函数，TIM默认也为内部时钟
	
	/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定义结构体变量
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;		//时钟分频，选择不分频，此参数用于配置滤波器时钟，不影响时基单元功能
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	//计数器模式，选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = ARR - 1;					//计数周期，即ARR的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = PSC - 1;				//预分频器，即PSC的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;			//重复计数器，高级定时器使用
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);					
	
	/*中断输出配置*/
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);						//清除定时器更新标志位,TIM_TimeBaseInit函数末尾，手动产生了更新事件，若不清除此标志位，则开启中断后，会立刻进入一次中断
	
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);					//开启TIM2的更新中断
	
	/*NVIC中断分组*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				//配置NVIC为分组2,此分组配置在整个工程中仅需调用一次
	
	/*NVIC配置*/
	NVIC_InitTypeDef NVIC_InitStructure;						//定义结构体变量
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;				//选择配置NVIC的TIM2线
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC线路使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	//指定NVIC线路的抢占优先级为2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//指定NVIC线路的响应优先级为1
	NVIC_Init(&NVIC_InitStructure);								
	
	/*TIM使能*/
//	TIM_Cmd(TIM2, ENABLE);			//使能TIM2，定时器开始运行
}

void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) //进入中断表示定时器计数(CNT)溢出, 自增(10ms溢出一次, 可通过配置ARR, PSC和Tclk自定义溢出时间)
	{
		Time_Count++;				
		
		if((Time_Count >= 150) && !KEY_STATA0) 
		{
			TIM_Cmd(TIM2, DISABLE);	//关闭定时器
			Time_Count = 0;			//清空溢出次数
			Keyval_Count = 0;		//清空按键计数
			taskIndex = TaskTable[taskIndex].Return; //长击表示返回键
			OLED_Clear();
			APPTOIN_MUTEX = 1;
		}
		else if((Time_Count >= 50) && KEY_STATA0 && (Keyval_Count == 1)) 
		{
			TIM_Cmd(TIM2, DISABLE);	//关闭定时器
			Time_Count = 0;	//清空溢出次数	
			Keyval_Count = 0; //清空按键计数		
			taskIndex = TaskTable[taskIndex].Next; //单击表示下一位键
			APPTOIN_MUTEX = 1;
		}
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}

/**
  * 函    数：定时器中断初始化
  * 参    数：PSC :分频系数
  *			  ARR :计数周期
  * 返 回 值：无
  */
void Timer3_Init(uint16_t PSC,uint16_t ARR)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 开启TIM3的时钟
    
    /* 时基单元初始化 */
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频，选择不分频
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数器模式，向上计数
    TIM_TimeBaseInitStructure.TIM_Period = ARR - 1; // 计数周期
    TIM_TimeBaseInitStructure.TIM_Prescaler = PSC - 1; // 预分频器
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; // 重复计数器
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
    
    /* 中断输出配置 */
    TIM_ClearFlag(TIM3, TIM_FLAG_Update); // 清除定时器更新标志位
    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 开启TIM3的更新中断
    
    /* NVIC中断配置 */
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; // 选择配置NVIC的TIM3线
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; // 响应优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能
    NVIC_Init(&NVIC_InitStructure);
    
    /* 使能TIM3 */
    TIM_Cmd(TIM3, ENABLE); // 定时器开始运行
}


/**
  * 函    数：TIM3中断服务程序
  * 参    数：无
  * 返 回 值：无
  */
void TIM3_IRQHandler(void)
{
     if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET) // 检查TIM3更新中断发生与否
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 清除TIM3中断标志位

        timer3Counter++; // 增加计数器

        // 假设我们希望每100次中断设置一次captureFlag，即每1000ms
        if (timer3Counter >= 100)
        {
            captureFlag = 1; // 设置标志位
            timer3Counter = 0; // 重置计数器
        }
    }
}


